class Solution(object):
    def solveNQueens(self, n):
        """
https://leetcode.cn/problems/n-queens/description/
51. N 皇后

按照国际象棋的规则，皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上，并且使皇后彼此之间不能相互攻击。
给你一个整数 n ，返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案，该方案中 'Q' 和 '.' 分别代表了皇后和空位。
        :type n: int
        :rtype: List[List[str]]
        """
        def helper(cur, i, j, arr):
            if j >= n or i >= n:
                return False
            if self.valid(cur, i, j):
                cur[i][j] = 'Q'
                if i == n - 1:
                    arr.append(self.duplicate(cur))
                    cur[i][j] = '.'
                    return True
                helper(cur, i + 1, 0, arr)
            cur[i][j] = '.'
            if i == 0 or j == n - 1:
                return False
            return helper(cur, i, j + 1, arr)

        self.n = n
        result = []
        for y in range(n):
            cur = self.gen()
            arr = []
            helper(cur, 0, y, arr)
            for res in arr:
                result.append([''.join(r) for r in res])
        return result

    def valid(self, res, x, y):
        for i in range(x):
            if res[i][y] == 'Q':
                return False
            if y - (x - i) >= 0 and res[i][y - (x - i)] == 'Q':
                return False
            if y + (x - i) < self.n and res[i][y + (x - i)] == 'Q':
                return False
            return True

    def duplicate(self, arr):
        return [[c for c in r] for r in arr]

    def gen(self):
        cur = []
        for _ in range(self.n):
            cur.append(['.'] * self.n)
        return cur